﻿
using MediaToolkit;
using MediaToolkit.Model;
using MediaToolkit.Options;
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Controls;


namespace Ku.Modules.VideoTool.Utils
{
    public class FFmpegUtil
    {
        /// <summary>
        /// 视频压缩
        /// </summary>
        /// <param name="inputFilePath"></param>
        /// <param name="outputFilePath"></param>
        public void VideoCompression(string inputFilePath, string outputFilePath)
        {
            try
            {
                var inputFile = new MediaFile(inputFilePath);
                var outputFile = new MediaFile(outputFilePath);
                // 设置压缩选项
                using (var engine = new Engine())
                {
                    var options = new ConversionOptions
                    {
                        AudioSampleRate = AudioSampleRate.Default,//：指定音频的采样率，例如 44100 Hz 或 48000 Hz。它是音频质量的一个参数，越高的采样率通常意味着更高的音频质量。
                        VideoBitRate = 800000,//用于设置视频比特率，以 kbps 为单位。比特率越高，视频质量越好，文件大小也越大。它是一个可空类型，未设置时采用默认比特率。
                        VideoSize = VideoSize.Hd720,  // 调整视频尺寸 用于设置视频的分辨率（如 480p、720p、1080p）。如果想自定义分辨率，可以配合 CustomWidth 和 CustomHeight 属性使用。
                        VideoFps = 10,  //：设置视频的帧率（Frames Per Second），决定视频每秒播放多少帧。帧率越高，视频越流畅，但也会增加文件大小。
                        //CustomOutputArgs = "-preset fast -crf 28" // 使用自定义参数调整压缩质量 
                    };
                    engine.Convert(inputFile, outputFile, options);   // 执行压缩
                }
            }
            catch (Exception ex)
            {

                throw;
            }
        }


        public void Cmd(string inputPath, string outputPath)
        {
            var startInfo = new ProcessStartInfo
            {
                // FileName是要启动的应用程序的名称，此处是FFmpeg
                FileName = "ffmpeg",

                // Arguments是要传递给应用程序的命令行参数
                // 这里的参数意味着：
                // -i {inputPath}：指定输入文件的路径
                // -c:v libx264：设置视频编码器为libx264（H.264）
                // -crf 28：设置视频的质量，CRF值越低，视频质量越高，文件也越大
                // -preset fast：设置编码速度，fast意味着编码速度快，但文件可能会稍大一些
                // -c:a aac：设置音频编码器为aac
                // {outputPath}：指定输出文件的路径
                // -y：如果输出文件已存在，无提示覆盖输出文件
                Arguments = $"-i {inputPath} -c:v libx264 -crf 28 -preset fast -c:a aac {outputPath} -y",

                // UseShellExecute设置是否使用操作系统shell来启动进程
                // 如果设置为false，那么不使用shell，而是直接从创建的进程中启动应用程序
                UseShellExecute = false,

                // RedirectStandardOutput和RedirectStandardError设置是否重定向应用程序的输出和错误
                // 如果设置为true，那么可以从Process.StandardOutput和Process.StandardError中读取应用程序的输出和错误
                RedirectStandardOutput = true,
                RedirectStandardError = true,

                // CreateNoWindow设置是否在启动应用程序时创建新的窗口
                // 如果设置为true，那么在启动应用程序时不会创建新的窗口
                CreateNoWindow = false
            };

            using (var process = new Process())
            {
                process.StartInfo = startInfo;

                // 订阅输出和错误事件
                process.OutputDataReceived += ProcessOutputDataReceived;
                process.ErrorDataReceived += ProcessErrorDataReceived;

                process.Start();

                // 开始异步读取输出和错误流
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();

                process.WaitForExit();
            }

            Debug.WriteLine("视频压缩完成！");
        }

        // 处理输出信息，获取错误信息
        private static void ProcessErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Data))
            {
                Debug.WriteLine(e.Data);

                // 解析输出信息以获取进度
                ParseProgress(e.Data);
            }
        }

        // 处理标准输出（这里主要用不到，因为FFmpeg的进度输出通常在标准错误流）
        private static void ProcessOutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Data))
            {
                Debug.WriteLine(e.Data);
            }
        }
        // 解析 FFmpeg 输出以获取进度
        private static void ParseProgress(string data)
        {
            // 正则表达式查找时间戳，例如 "time=00:00:10.50"
            var match = Regex.Match(data, @"time=(\d+:\d+:\d+\.\d+)");

            if (match.Success)
            {
                var timeString = match.Groups[1].Value;

                // 转换时间为 TimeSpan 进行计算
                if (TimeSpan.TryParse(timeString, out TimeSpan currentTime))
                {
                    // 这里可以计算当前时间的进度（假设已知视频的总时长）
                    // 例如，假设视频总时长为1小时:
                    TimeSpan totalDuration = new TimeSpan(0, 1, 0, 0); // 1小时

                    double progress = currentTime.TotalSeconds / totalDuration.TotalSeconds * 100;
                    Debug.WriteLine($"当前进度: {progress:0.00}%");
                }
            }
        }
    }
}